"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 23、pytest编写插件.py
"""
import pytest


# ============== hookspec文件在 External Libraries  -> _pytest -> hookspec =====================
# ================= 好的框架允许定制 和 扩展 ======================

# 内置插件：Hook函数
# 是个函数，在系统触发时被系统调用
# 自动触发机制

@pytest.mark.parametrize('name', ['哈利', '波特'])
def test_name(name):
    print(f'name是：{name}')


# 在conftest里，定义以下
import yaml

from typing import Optional


# ================== 1. 添加前后置 ==============================
def pytest_runtest_setup(item: "Item") -> None:
    print("hook: setup")


def pytest_runtest_teardown(item: "Item", nextitem: Optional["Item"]) -> None:
    print('hook: teardown')


# =========================== 2. 修改编码格式   ===============================================

"""
一、含有中文的测试用例名称，改写编码格式
修改默认编码格式
    1、测试用例的名字
    2、测试用例的路径
"""


# 收集完测试用例，之后被调用的hook函数
# =================== 2. 修改编码格式（支持中文），pytest 默认编码格式为 unicode ============================
def pytest_collection_modifyitems(session, config, items) -> None:
    for item in items:
        # name : 测试用例的名字
        item.name = item.name.encode("utf-8").decode("unicode_escape")
        # nodeid :  测试用例的路径
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")
    # 用例名称反转
    # items.reverse()


# ============= unicode  修改编码格式 ================
a = "\\u8d6b\\u654f"
a.encode("utf-8").decode("unicode_escape")


# ==========================    二、添加命令行参数(addoption)  =================================================
# 定义一个命令行参数
def pytest_addoption(parser):
    # 将下面所有的 option 都展示在这个 group 下
    mygroup = parser.getgroup('hogwarts')
    mygroup.addoption('--env',  # 注册一个命令行选项
                      default='test',  # 参数的默认值
                      dest='env',  # 存储的变量，为属性命令，可以使用 Option 对象访问到这个值，暂用不到
                      help='set your run env'  # 帮助提示，参数的描述信息
                      )
    mygroup.addoption('--env1',  # 注册一个命令行选项
                      default='test1',  # 参数的默认值
                      dest='env1',  # 存储的变量，为属性命令，可以使用 Option 对象访问到这个值，暂用不到
                      help='set your run env'  # 帮助提示，参数的描述信息
                      )


@pytest.fixture(scope='session')
def cmdoption(request):
    res = request.config.getoption('--env')
    return res


@pytest.fixture(scope='session')
def cmdoption(request):
    myenv = request.config.getoption('--env', default='test')
    if myenv == 'test':
        datapath = 'datas/test/data.yaml'
    elif myenv == 'dev':
        datapath = 'datas/test/data.yaml'

    with open(datapath) as f:
        datas = yaml.safe_load(f)
    return myenv, datas


if __name__ == '__main__':
    cmdoption()

#  =======================    打包发布（开源） ==========================
# 帖子链接： ceshiren.com/t/topic/14156
"""
发布到： www.pypi.org(python第三方库平台)
代码上传： github
打包项目构成：
    源码包
    setup.py（构建）
    测试包
"""

from setuptools import setup, find_packages

setup(
    name='pytest_encode',
    url='https://github.com/xxx/pytest-encode',
    version='1.0',
    author='MackJia',
    author_email='214829112@qq.com',
    description='set your encoding and logger',
    long_description='show chinese for mark.parametrize(),Define logger...............',
    # 分类索引，pip 对所属包的分类
    classifiers=[
        'Framework::Pytest',
        'Programming Language::Python',
        'Topic::Software Development:: Testing',
        'Programming Language:: Python:: 3.8',
    ],
    license='proprietary',
    package=find_packages(),
    keywords=[
        'pytest', 'py.test', 'pytest_encode',
    ],
    # 需要安装的依赖包
    install_requires=[
        'pytest'
    ],
    # 入口函数
    entry_points={
        'pytest11': [
            'pytest_encode = pytest_encode.main',
        ]
    },
    zip_safe=False

)

# 打包命令
"""
依赖包安装：
    pip install setuptools (python 包的管理工具，负责安装和发布，尤其是安装拥有有关依赖关系的包)
    pip install wheel （生成 *.whl 格式的安装包，本质上也是一种压缩包）
打包命令：
    python setup.py sdist bdist_wheel
    
"""

# 发布命令
"""
python -m pip install --user --upgrade twine （安装 twine 工具）
python -m twine upload --repository testpypi dist/* (上传代码)
"""
